package it.saga.pes.frontoffice.servizi.struts2.rsm2.action;

import it.saga.pes.business.bean.infra.autorizzazioni.SoggettoFisicoBean;
import it.saga.pes.business.bean.infra.servizi.DocumentoBean;
import it.saga.pes.business.bean.misc.ChiaveValore;
import it.saga.pes.business.bean.servizi.PersonaFisicaBean;
import it.saga.pes.frontoffice.servizi.struts2.rsm2.bean.PraticaMensa;
import it.saga.pes.frontoffice.servizi.struts2.rsm2.util.ScolasticiMensaUtils;
import it.saga.pes.infra.utility.TipiOggetti;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

@SuppressWarnings("serial")

public class ScolasticiMensaAction extends ActionSupport implements SessionAware , Preparable {
	
	public final String[] steps={"inizio","richiedente","fruitore","istituto","riepilogo","allegati","fine"};	
	
	//public final String servizio = "RICHIESTA SERVIZIO MENSA";
	
	private static final Log log = LogFactory.getLog(ScolasticiMensaAction.class);
	
	private static final String STEP = "STEP";
	private static final String PRATICA = "PRATICA";
	private static String LISTA_COMUNI = "LISTA_COMUNI";
	private static String LISTA_COMUNI_COMPLETA = "LISTA_COMUNI_COMPLETA";
	private static String LISTA_PROVINCE = "LISTA_PROVINCE";
	private static String LISTA_CITTADINANZA = "LISTA_CITTADINANZA";
	private static String LISTA_SESSO = "LISTA_SESSO";
	private static String LISTA_FIGLI = "LISTA_FIGLI";
	
	private static String LISTA_ANNI = "LISTA_ANNI";
	private static String LISTA_CIRCOLI = "LISTA_CIRCOLI";
	private static String LISTA_TIPO_ISTITUTO = "LISTA_TIPO_ISTITUTO";
	private static String LISTA_ISTITUTI = "LISTA_ISTITUTI";
	private static String LISTA_CLASSI = "LISTA_CLASSI";
	
	private static String LISTA_TIPO_MENSA = "LISTA_TIPO_MENSA";
	private static String LISTA_TIPO_DIETA = "LISTA_TIPO_DIETA";
	private static String LISTA_TIPI_ALLEGATO = "LISTA_TIPI_ALLEGATO";
	
	public String step;
	
	private boolean inizialize = false;
	
	public int getIndex(){
		return Arrays.asList(steps).indexOf(step);
	}
	
	private PraticaMensa pratica = null;
	
	// TODO , vedere come togliere
	public Long idEnte;
	public Long idServizio;
	
	public List<ChiaveValore> listaSesso;
	public List<ChiaveValore> listaProvince;
	public List<ChiaveValore> listaComuniCompleta;
	public List<ChiaveValore> listaComuni;
	public List<ChiaveValore> listaCittadinanza;
	public List<ChiaveValore> listaFigli;
	
	public List<ChiaveValore> listaCircoli;
	public List<ChiaveValore> listaTipoIstituto;
	public List<ChiaveValore> listaIstituti;
	public List<ChiaveValore> listaClassi;
	public List<ChiaveValore> listaAnni;
	
	public List<ChiaveValore> listaTipoMensa;
	public List<ChiaveValore> listaTipoDieta;
	public List<DocumentoBean> listaTipiAllegato;
	
	
	private Map<String, Object> session ;
	
	@Override
	public void setSession(Map<String, Object> session) {
        this.session = session ;
    }
	
	@SuppressWarnings("unchecked")
	@Override
	public void prepare() throws Exception {
		System.out.println("PREPARE");
		
		SoggettoFisicoBean sf = (SoggettoFisicoBean) session.get(TipiOggetti.SESSION_LOGIN_UTENTE_BEAN);
		if(sf!=null){
			Long pkidEnte = sf.getPkidEnteResidenza();
			
			step = (String) session.get(STEP);
			pratica = (PraticaMensa) session.get(PRATICA);
			listaComuniCompleta = (List<ChiaveValore>) session.get(LISTA_COMUNI_COMPLETA);
			listaProvince = (List<ChiaveValore>) session.get(LISTA_PROVINCE);
			listaCittadinanza = (List<ChiaveValore>) session.get(LISTA_CITTADINANZA);
			listaSesso = (List<ChiaveValore>) session.get(LISTA_SESSO);
			listaFigli = (List<ChiaveValore>) session.get(LISTA_FIGLI);
			
			listaCircoli = (List<ChiaveValore>) session.get(LISTA_CIRCOLI);
			listaIstituti = (List<ChiaveValore>) session.get(LISTA_ISTITUTI);
			listaClassi = (List<ChiaveValore>) session.get(LISTA_CLASSI);
			listaAnni = (List<ChiaveValore>) session.get(LISTA_ANNI);
			listaTipoMensa = (List<ChiaveValore>) session.get(LISTA_TIPO_MENSA);
			listaTipoIstituto = (List<ChiaveValore>) session.get(LISTA_TIPO_ISTITUTO);
			
			listaTipiAllegato = (List<DocumentoBean> ) session.get(LISTA_TIPI_ALLEGATO);
			
			if(listaSesso==null){
				listaSesso = new ArrayList<ChiaveValore>();
				listaSesso.add(new ChiaveValore("1","Maschio"));
				listaSesso.add(new ChiaveValore("2","Femmina"));
				session.put(LISTA_SESSO,listaSesso);
			}
			if(listaAnni==null){
				listaAnni = new ArrayList<ChiaveValore>();
				// TODO anno scolastico caricare da infra
				listaAnni.add(new ChiaveValore("2013","2013/2014"));
				listaAnni.add(new ChiaveValore("2014","2014/2015"));
				session.put(LISTA_ANNI,listaAnni);
			}
			if(listaTipoMensa==null){
				listaTipoMensa = new ArrayList<ChiaveValore>();
				// TODO tipo mensa caricare da infra
				listaTipoMensa.add(new ChiaveValore("5","5 GIORNI"));
				listaTipoMensa.add(new ChiaveValore("4","4 GIORNI"));
				session.put(LISTA_TIPO_MENSA,listaTipoMensa);
			}
			if(listaTipoDieta==null){
				listaTipoDieta = new ArrayList<ChiaveValore>();
				// TODO tipo mensa caricare da infra
				listaTipoDieta.add(new ChiaveValore("5","NORMALE"));
				listaTipoDieta.add(new ChiaveValore("4","SPECIALE"));
				session.put(LISTA_TIPO_DIETA,listaTipoDieta);
			}
			if(listaTipoIstituto==null){
				listaTipoIstituto = new ArrayList<ChiaveValore>();
				listaTipoIstituto.add(new ChiaveValore("m","SCUOLA DELL’INFANZIA"));
				listaTipoIstituto.add(new ChiaveValore("e","SCUOLA PRIMARIA"));
				listaTipoIstituto.add(new ChiaveValore("d","SCUOLA SECONDARIA DI PRIMO GRADO"));
				listaTipoIstituto.add(new ChiaveValore("n","ASILO NIDO"));
				listaTipoIstituto.add(new ChiaveValore("a","ALTRO"));
				session.put(LISTA_TIPO_ISTITUTO,listaTipoIstituto);
			}	
			if(listaProvince==null){
				listaProvince = ScolasticiMensaUtils.listaProvince(pkidEnte);
				session.put(LISTA_PROVINCE,listaProvince);
			}
			if(listaComuniCompleta==null){
				listaComuniCompleta = ScolasticiMensaUtils.listaComuniCompleta(pkidEnte);
				session.put(LISTA_COMUNI_COMPLETA,listaComuniCompleta);
			}
			if(listaCittadinanza==null){
				listaCittadinanza = ScolasticiMensaUtils.listaCittadinanza(pkidEnte);
				session.put(LISTA_CITTADINANZA,listaCittadinanza);
			}
			if(listaCircoli==null){
				listaCircoli = ScolasticiMensaUtils.listaCircoli(pkidEnte);
				session.put(LISTA_CIRCOLI,listaCircoli);
			}
		}
	}
	
	public PraticaMensa getPratica() {
		return pratica;
	}

	public void setPratica(PraticaMensa pratica) {
		this.pratica = pratica;
	}
	
	private boolean inizialize() throws Exception {
		String idEnteStr = ServletActionContext.getRequest().getParameter("idEnte");
		String idServizioStr = ServletActionContext.getRequest().getParameter("idServizio");
		System.out.println(">idEnte:"+idEnteStr);
		System.out.println(">idServizio:"+idServizioStr);
		BigDecimal idEnte = null;
		BigDecimal idServizio = null;
		try{
			idEnte = new BigDecimal(idEnteStr);
			idServizio = new BigDecimal(idServizioStr);
		}catch(Exception e){
			log.error("idEnte o idServizio non validi !");
		}
		
		String ente = ScolasticiMensaUtils.cercaEnte(idEnte.longValue()).getDescrizione();
		String servizio = ScolasticiMensaUtils.cercaServizio( idServizio.longValue(), idEnte.longValue()).getDescrizione();
		
		if(listaTipiAllegato==null){
			listaTipiAllegato = ScolasticiMensaUtils.listaAllegati(idEnte.longValue(), idServizio.longValue(),null);
			session.put(LISTA_TIPI_ALLEGATO,listaTipiAllegato);
		}
		pratica = new PraticaMensa();
		pratica.setEnte(ente);
		pratica.setServizio(servizio);
		// vedere se presente in backoffice , altrimenti da portale
		SoggettoFisicoBean sf = (SoggettoFisicoBean) session.get(TipiOggetti.SESSION_LOGIN_UTENTE_BEAN);
		pratica.setIdEnteDestinatario(idEnte);
		pratica.setIdServizio(idServizio);
		String codiceFiscale = sf.getCodiceFiscale().toUpperCase();
		Long idEnteResidenza = sf.getPkidEnteResidenza();
		PersonaFisicaBean persona = ScolasticiMensaUtils.cercaSoggetto(codiceFiscale, idEnteResidenza);
		persona.setTelefono(sf.getTelefono());
		persona.setCellulare(sf.getCellulare());
		persona.setEmail(sf.getEmail());
		Long idEnteNascita = sf.getPkidEnteNascita();
		log.debug("idEnteNascita :" + idEnteNascita);
		if(listaComuni==null){
			listaComuni = ScolasticiMensaUtils.listaComuniProvincia(idEnteNascita, idEnteResidenza);
			session.put(LISTA_COMUNI,listaComuni);
		}
		pratica.setPersonaRichiedente(persona);
		session.put(PRATICA,pratica);
		return true;
	}
	
	@SkipValidation
	public String inizio() throws Exception {
		System.out.println("INIZIO");
		step = "inizio";
		session.put(STEP,step);
		if (!inizialize)
			inizialize = inizialize();
		return SUCCESS;
	}	
	
	@SkipValidation
	public String richiedente() {
		// if(initializeSession) ....
		System.out.println("RICHIEDENTE");
		return SUCCESS;
	}
	
	@SkipValidation
	public String richiedenteIndietro() {
		step = "inizio";
		return SUCCESS;
	}
	
	@SuppressWarnings("unchecked")
	public String richiedenteAvanti() {
		log.debug("to step :" + step);
		log.debug("pratica :" + pratica);
		step="fruitore";
		session.put(STEP,step);
//		if(pratica.getPersonaFruitore()==null)
//			pratica.setPersonaFruitore(new PersonaFisicaBean());
		SoggettoFisicoBean sf = (SoggettoFisicoBean) session.get(TipiOggetti.SESSION_LOGIN_UTENTE_BEAN);
		Long pkidEnte = sf.getPkidEnteResidenza();
		String codiceFiscale = sf.getCodiceFiscale().toUpperCase();
		listaFigli = (List<ChiaveValore>)session.get(LISTA_FIGLI);
		if(listaFigli==null){
			listaFigli = ScolasticiMensaUtils.listaFigli(codiceFiscale,pkidEnte);
			session.put(LISTA_FIGLI, listaFigli);
		}
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@SkipValidation
	public String fruitore() {
		System.out.println("FRUITORE");
		step="fruitore";
		return SUCCESS;
	}
	
	@SkipValidation
	public String fruitoreReload() {
		System.out.println("FRUITORE-RELOAD");
		String codiceFiscale = pratica.getPersonaFruitore().getCodiceFiscale();
		System.out.println("codiceFiscale:"+codiceFiscale);
		Long idEnte = pratica.getIdEnteDestinatario().longValue();
		PersonaFisicaBean fruitore = ScolasticiMensaUtils.cercaSoggetto(codiceFiscale, idEnte);
		pratica.setPersonaFruitore(fruitore);
		return SUCCESS;
	}
	
	@SkipValidation
	public String fruitoreIndietro() {
		step="richiedente";
		session.put(STEP,step);	
		return SUCCESS;
	}
	
	public String fruitoreAvanti() {
		step="istituto";
		session.put(STEP,step);	
		session.put(PRATICA, pratica);
		String codScuola = pratica.getIstituto();
		String tipoIstituto = pratica.getTipoIstituto();
		Long idEnte = pratica.getIdEnteDestinatario().longValue();
		if(codScuola!=null && codScuola.length()>0){
			listaClassi = ScolasticiMensaUtils.listaClassi(codScuola,idEnte);
		}else{
			listaClassi = new ArrayList<ChiaveValore>();
		}
		if(tipoIstituto!=null && tipoIstituto.length()>0){
			listaIstituti = ScolasticiMensaUtils.listaScuole(tipoIstituto,idEnte);
		}else{
			listaIstituti = new ArrayList<ChiaveValore>();
		}
		session.put(LISTA_ISTITUTI,listaIstituti);
		session.put(LISTA_CLASSI,listaClassi);
		return SUCCESS;
	}
	
	@SkipValidation
	public String istituto() {
		step="istituto";
		return SUCCESS;
	}
	
	@SkipValidation
	public String istitutoReload() {	
		step="istituto";
		String codScuola = pratica.getIstituto();
		String tipoIstituto = pratica.getTipoIstituto();
		Long idEnte = pratica.getIdEnteDestinatario().longValue();
		log.debug("codScuola :" + codScuola);	
		log.debug("tipoIstituto :" + tipoIstituto);
		log.debug("idEnte :" + idEnte);
		if(tipoIstituto!=null && tipoIstituto.length()>0){
			listaIstituti = ScolasticiMensaUtils.listaScuole(tipoIstituto,idEnte);
		}else
			listaIstituti=new ArrayList<ChiaveValore>();
		if(codScuola!=null && codScuola.length()>0){
			listaClassi = ScolasticiMensaUtils.listaClassi(codScuola,idEnte);
		}else 
			listaClassi=new ArrayList<ChiaveValore>();
		session.put(LISTA_ISTITUTI,listaIstituti);
		session.put(LISTA_CLASSI,listaClassi);
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@SkipValidation
	public String istitutoIndietro() {
		step="fruitore";
		session.put(STEP,step);	
		return SUCCESS;
	}
	
	public String istitutoAvanti() {
		step="riepilogo";
		pratica.setDesCircolo(ScolasticiMensaUtils.find(pratica.getCircolo(),listaCircoli));
		pratica.setDesTipoIstituto(ScolasticiMensaUtils.find(pratica.getTipoIstituto(),listaTipoIstituto));
		pratica.setDesIstituto(ScolasticiMensaUtils.find(pratica.getIstituto(),listaIstituti));
		pratica.setDesClasse(ScolasticiMensaUtils.find(pratica.getClasse(),listaClassi));
		session.put(STEP,step);	
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	@SkipValidation
	public String riepilogo() {
		step="riepilogo";
		return SUCCESS;
	}
	
	@SkipValidation
	public String riepilogoIndietro() {
		step="istituto";
		session.put(STEP,step);	
		return SUCCESS;
	}
	
	public String riepilogoAvanti() {
		step="fine";
		System.out.println(">>>>>>> pulisci pratica");
		// RIMUOVE DATI IN SESSIONE e tutte eccosse
		session.remove(PRATICA);
		return SUCCESS;
	}
	
	@SkipValidation
	public String fine() {	
		System.out.println("FINE");
		step="fine";
		return SUCCESS;
	}
	
	@SkipValidation
	public String pratica() {	
		System.out.println("PRATICA");
		String codiceFiscale = pratica.getPersonaRichiedente().getCodiceFiscale();
		Long idEnte = pratica.getIdEnteDestinatario().longValue();
		pratica = ScolasticiMensaUtils.getInfoUtente(codiceFiscale, idEnte);
		session.put(PRATICA, pratica);
		return SUCCESS;
	}
	
	public void validate() {
		System.out.println("STEP:"+step);
		// se sono presenti errori sono di conversione , annulla il vecchio valore
		for(String key:getFieldErrors().keySet()){
			setProperty(pratica,key.replace("pratica.", ""),null);
		}	
		if(step.equals("richiedente")){
			String cognomeR = (String) getProperty(pratica,"personaRichiedente.cognome");
			if(cognomeR==null || cognomeR.length()==0){
				addFieldError("pratica.personaRichiedente.cognome", "campo richiesto");
			}
			String nomeR = (String) getProperty(pratica,"personaRichiedente.nome");
			if(nomeR==null || nomeR.length()==0){
				addFieldError("pratica.personaRichiedente.nome", "campo richiesto");
			}
		}else if(step.equals("fruitore")){
			String cognomeR = (String) getProperty(pratica,"personaRichiedente.cognome");
			if(cognomeR==null || cognomeR.length()==0){
				addFieldError("pratica.personaRichiedente.cognome", "campo richiesto");
			}
			String cognomeF = (String) getProperty(pratica,"personaFruitore.cognome");
			if(cognomeF==null || cognomeF.length()==0){
				addFieldError("pratica.personaFruitore.cognome", "campo richiesto");
			}
		}else if(step.equals("istituto")){
			String circolo = (String) getProperty(pratica,"circolo");
			if(circolo==null || circolo.length()==0){
				addFieldError("pratica.circolo", "circolo richiesto");
			}
			String tipo = (String) getProperty(pratica,"tipoIstituto");
			if(tipo==null || tipo.length()==0){
				addFieldError("pratica.tipoIstituto", "tipo istituto richiesto");
			}
			String istituto = (String) getProperty(pratica,"istituto");
			if(istituto==null || istituto.length()==0){
				addFieldError("pratica.istituto", "istituto richiesto");
			}
			String annoScolastico = (String) getProperty(pratica,"annoScolastico");
			if(annoScolastico==null || annoScolastico.length()==0){
				addFieldError("pratica.annoScolastico", "anno scolastico richiesto");
			}
			// ISEE
			Double redditoIsee = (Double) getProperty(pratica,"redditoIsee");
			if(redditoIsee==null){
				addFieldError("pratica.redditoIsee", "reddito Isee richiesto");
			}
			Date scadenzaIsee = (Date) getProperty(pratica,"scadenzaIsee");
			if(scadenzaIsee==null){
				addFieldError("pratica.scadenzaIsee", "data scadenza Isee richiesto");
				
			}else{
				// controlla se impostato valore isee
				
			}
//			String annoScolastico = (String) getProperty(pratica,"annoScolastico");
//			if(annoScolastico==null || annoScolastico.length()==0){
//				addFieldError("pratica.annoScolastico", "anno scolastico richiesto");
//			}
		}
		
	}
	
	private static Object getProperty(Object bean,String property){
		try {
			return PropertyUtils.getProperty(bean,property);
		} catch (Exception e) {
			return null;
		}
	}
	
	private static void setProperty(Object bean,String property, Object value){
		try {
			PropertyUtils.setProperty(bean,property,value);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
